[Design Pattern] 팩토리 메소드(Factory Method) 패턴

업데이트:




✅ 팩토리 메소드 패턴 (Factory Method)

  • 객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화 하는 패턴

  • 객체의 생성코드를 별도의 클래스/메소드로 분리함으로써 객체 생성의 변화 대비에 유용

  • 객체 생성 기능처럼 특정 기능을 개별 클래스를 통해 구현하는 것은 바람직한 객체 지향 설계 방법이다.

  • 생성 (Creational) 패턴의 하나이다.

  • 기존 코드 변경 없이 확장하기 위한 디자인 패턴!





📌 Product     팩토리 메소드로 생성 될 객체의 공통 인터페이스        📌 ConcreteProduct     구체적으로 객체가 생성되는 클래스     📌 Creator     팩토리 메소드를 갖는 클래스     📌 ConcreteCreator     팩토리 메소드를 구현하는 클래스, ConcreteProduct 객체 생성





✅ 팩토리 메소드 예제

⭐ 사용자 관리 프로그램이 있고 네이버 계정으로 가입할 수 있다.


📌 Product ( User )

public  interface User { 
	void signup(); 
}

-User 인터페이스 정의


public  class NaverUser implements User { 
	@Override  
	public void signup() { 
		System.out.println("네이버 아이디로 가입"); 
	} 
}
  • User 인터페이스를 구현하는 NaverUser 클래스
  • 오버라이드한 메소드에서는 네이버 유저 전용 로직 추가



📌 Creator ( UserFactory )

⭐ 실제로 객체를 생성하는 Factory
public abstract class UserFactory { 
	public User newInstance() { 
		User user = createUser(); 
		user.signup(); 
		return user;
	} 
	protected abstract User createUser(); 
}
  • 추상클래스로 UserFactory를 정의
  • 실제 객체를 생성하는 곳 ( 일종의 팩토리 )
  • 외부에서 User 객체를 생성 할 때는 newInstance() 메서드 호출
  • 어떤 객체를 생성할 지는 하위 클래스에서 결정


public class NaverUserFactory extends UserFactory {
	@Override  
	protected User createUser() { 
		return new NaverUser(); 
	} 
}
  • UserFactory를 상속받는 NaverUserFactory



📌 Client

UserFactory userFactory = new NaverUserFactory(); 
User user = userFactory.newInstance();
  • 클라이언트 코드에서 NaverUser 클래스에 대한 의존성 없이 사용





✅ 팩토리 메소드 확장

팩토리 메소드의 가장 큰 장점은 확장 시 기존 코드의 변경 없이도 확장이 가능하다는 것이다. 따라서 위 예시에서 네이버 외에 다른 회사가 추가 되어도 기존 코드 변경 없이 추가할 수 있다. 카카오 서비스가 새로 추가된다고 가정해보자.

public class NaverUser implements User { 
	@Override  
	public void signup() { 
		System.out.println("네이버 아이디로 가입"); 
	} 
}

public class KakaoUser implements User { 
	@Override  
	public void signup() { 
		System.out.println("카카오 아이디로 가입"); 
	} 
}
  • KakaoUser 클래스를 추가해준다.



public class NaverUserFactory extends UserFactory {
	@Override  
	protected User createUser() { 
		return new NaverUser(); 
	} 
}

public class KakaoUserFactory extends UserFactory {
	@Override  
	protected User createUser() { 
		return new KakaoUser(); 
	} 
}
  • NaverUserFactory 와 동일하게 KakaoUserFactory 정의



UserFactory userFactory = new NaverUserFactory(); 
User user = userFactory.newInstance();

UserFactory userFactory = new KakaoUserFactory(); 
User user = userFactory.newInstance();
  • 클라이언트에 새로운 Kakao객체 선언해주면서 기존 코드 변경없이 확장 가능!

댓글남기기